import { mgrs } from "../../../system/OverallSystem ";
import { authorizeParams, getUserInfoParams, loadParams, loginParams, MiniGameApiBase, ModalParams, recordedGameScreenParams, toastParams } from "../miniGameBase/miniGameApiBase";

export interface OnloadCB {
    adId: string;//广告标识，用来上报曝光与点击
    title: string;//广告标题
    desc: string;//广告描述
    icon: string;//推广应用的Icon图标
    imgUrlList: any[];//广告图片
    logoUrl: string;//广告标签图片
    clickBtnTxt: string;//点击按钮文本描述
    creativeType: number;//获取广告类型，取值说明：0：混合
    interactionType: number;//获取广告点击之后的交互类型，取值说明： 1：网址类 2：应用下载类 8：快应用生态应用
}

export interface VivoVideoAd {
    // 通过 load 方法主动预加载广告内容。
    // 此外，在显示广告出现问题时也可以尝试主动 load 一次。
    // 该方法返回一个 Promise，如果广告已经自动拉取成功，调用该方法返回一个 resolved Promise；
    load: () => Promise<any>;
    // 广告创建后默认是隐藏的，可以通过该方法显示广告。 该方法返回一个 Promise 对象。当广告组件正常获取素材时，该 Promise 对象会是一个 resolved Promise。当广告组件发生错误时，会是一个 rejected Promise，参数与error事件监听器获得的参数相同。
    show: () => Promise<any>;
    //绑定 load 事件的监听器，用户在手动调用 load 方法后，广告组件会预先加载。 广告组件成功拉取广告素材时会触发load事件的监听器。
    //确保监听此事件时，开发者主动调用过 load 方法。
    onLoad: (listener: Function) => void;
    // 解除绑定 load 事件的监听器。
    offLoad: (listener: Function) => void;
    //绑定 error 事件的监听器。 广告组件拉取广告素材和其他情况下如果发生错误，会触发error事件的监听器。监听器会获得一个包含errCode和errMsg属性的对象参数。
    //     errCode 详情
    onError: (listener: (error: any) => void) => void;
    //    解除绑定 error 事件的监听器。
    offError: (listener: Function) => void;
    //    绑定 close 事件的监听器。 当用户点击了 Video 广告上的关闭按钮时，会触发close事件的监听器。监听器会获得一个包含isEnded属性的对象参数，表征用户是否完整观看了视频。
    onClose: (listener: (res: { isEnded: boolean }) => void) => void;
    //解除绑定 close 事件的监听器。
    offClose: (listener: Function) => void;

    //
    destroy();
}

const vivo: any = window['qg'];
export default class VivoApi extends MiniGameApiBase {



    protected m_AppId: string = "";
    protected m_Secret: string = "";

    protected m_VideoAdIdIndex: number = 0;
    protected m_VideoAdIdList: string[] = ['240a2919d9684d4d9a9ac0d79619635d'];

    protected m_BannerAdIdIndex: number = 0;
    protected m_BannerAdId: string[] = ['9942cc2afd0f41ac8241b38c86ef2eec'];

    protected m_InsertAdIdIndex: number = 0;
    protected m_InsertAdId: string[] = [];


    protected m_videoAd: VivoVideoAd = undefined;
    protected m_BannerAd: any = undefined;

    validAppId(): void {
        console.log("vivo-api-validAppId");
        vivo.onShow((res) => {
            // cc.log("启动参数如下：", res.query);
            // cc.log("来源信息如下：", res.refererInfo);
            mgrs().soundMgr.playMusic('bgm');
        });
    }

    ready(): void {
        console.log("vivo-api-ready");
    }

    getUserInfo(params: getUserInfoParams): void {
        vivo.getUserInfo(params);
    }

    showToast(params: toastParams): void {
        vivo.showToast(params);
    }

    showLoading(params): void {
        vivo.showLoading(params);
    }

    hideLoading(): void {
        vivo.hideLoading();
    }

    showModal(params: ModalParams): void {
    }

    authorize(params: authorizeParams): void {
        params.success && params.success();
    }

    login(params: loginParams): void {
        vivo.login(params);
    }


    FullScreenVideoAd(){
        
    }

    
    reportAnalytics(name,data){
        
    }

    getVideoAdId(): string {
        const id: string = this.m_VideoAdIdList[this.m_VideoAdIdIndex];
        this.m_VideoAdIdIndex++;
        if (this.m_VideoAdIdIndex >= this.m_VideoAdIdList.length) {
            this.m_VideoAdIdIndex = 0;
        }
        return id;
    }

    loadAndShowVideoAd(successCB: () => void, errorCB: (error: any) => void, completeCB?: () => void, reportAnalyticsExplain?: string): void {
        this.showLoading({ message:'请求中'});
        if (this.m_videoAd == null) {
            this.m_videoAd = vivo.createRewardedVideoAd({ adUnitId: this.getVideoAdId() });
        }

        let onClose = (res) => {
            if (res && res.isEnded) {
                // 给予奖励
                successCB();
                // O1HD.getManagers().soundMgr.setSoundEnabled(true);
            } else {
                //
                errorCB('视频中途退出');
                // O1HD.getManagers().soundMgr.setSoundEnabled(true);
            }
            this.m_videoAd.offClose(onClose);
            completeCB && completeCB();
        };

        //
        this.m_videoAd.load().then(() => { //加载视频广告完成
            this.m_videoAd.show().then(() => { //播放视频广告完成
                this.hideLoading();
                this.m_videoAd.onClose(onClose);
                // O1HD.getManagers().soundMgr.setSoundEnabled(true);
                // O1HD.getManagers().soundMgr.playMusic("BGM1");

            }).catch((err) => { //播放视频广告错误
                this.showToast(
                {
                    title: "视频加载错误",
                    icon: "none",
                })
                this.hideLoading();
                errorCB('视频显示错误  :' + JSON.stringify(err));
                this.m_videoAd.offClose(onClose);
                completeCB && completeCB();
            })

        }).catch((err) => { //加载视频广告错误
            this.showToast(
            {
                title: "视频加载错误",
                icon: "none",
            })
            this.hideLoading();
            errorCB('视频加载错误  :' + JSON.stringify(err));
            this.m_videoAd.offClose(onClose);
            completeCB && completeCB();
        });
    }



    getInsertAdId(): string {
        const id: string = this.m_InsertAdId[this.m_InsertAdIdIndex];
        this.m_InsertAdIdIndex++;
        if (this.m_InsertAdIdIndex >= this.m_InsertAdId.length) {
            this.m_InsertAdIdIndex = 0;
        }
        return id;
    }

    showInsertAd(onAdClose: () => void, onFailed: () => void): void {

        console.log("加抖音 插屏 广告");

        const adId = this.getInsertAdId();
        let insertAd = vivo.createInterstitialAd({
            adUnitId: adId,
        });

        insertAd.load();
        insertAd.onLoad(() => {
            console.warn('插屏广告 加载完成');

            insertAd.show().catch((err) => {
                console.warn('插屏广告 显示失败 :' + JSON.stringify(err));
                insertAd.destroy();
                insertAd = null;
                if (onFailed) {
                    onFailed();
                }
            });
        });

        insertAd.onError((err) => {
            console.warn('插屏广告 加载失败' + JSON.stringify(err));
            insertAd.destroy();
            insertAd = null;
            if (onFailed) {
                onFailed();
            }
        });

        insertAd.onClose(() => {
            console.warn('插屏广告 关闭');
            if (insertAd != null) {
                insertAd.destroy();
                insertAd = null;
            }
            if (onAdClose) {
                onAdClose();
            }
        });
    }

    protected bannerSuccese: boolean = false;

    getBannerAdId(): string {
        const id: string = this.m_BannerAdId[this.m_BannerAdIdIndex];
        this.m_BannerAdIdIndex++;
        if (this.m_BannerAdIdIndex >= this.m_BannerAdId.length) {
            this.m_BannerAdIdIndex = 0;
        }
        return id;
    }

    showBannerAD(node: cc.Node, successCB?: () => void, errorCB?: (error: any) => void, onCloseCB?: () => void,
        setBannerPos?: ({ screenWidth, screenHeight }: { screenWidth: any; screenHeight: any; }) => cc.Vec2): void {

        const { screenWidth, screenHeight } = vivo.getSystemInfoSync();
        let pos: cc.Vec2 = setBannerPos && setBannerPos({ screenWidth, screenHeight }) || cc.v2(0, 0);
        // var targetBannerAdWidth = 200;
        if (this.m_BannerAd && !this.bannerSuccese) {
            this.m_BannerAd.destroy()
            this.m_BannerAd = null
        }

        if (this.m_BannerAd) {
            this.m_BannerAd.show()
                .then(() => {
                    successCB && successCB();
                    console.log("---------------------Banner广告直接显示成功");
                })
                .catch((err) => {
                    errorCB && errorCB(err);
                    console.log("---------------------Banner广告直接显示组件出现问题", JSON.stringify(err));
                });
            return
        }

        this.bannerSuccese = true;

        if (this.m_BannerAd == null) {
            this.m_BannerAd = vivo.createBannerAd({
                posId: this.getBannerAdId(),
                adIntervals: 30,
                style: {
                    // width: targetBannerAdWidth,
                    // top: screenHeight - (targetBannerAdWidth / 16) * 9, // 根据系统约定尺寸计算出广告高度
                    left: pos.x,
                    top: pos.y,
                },
            });//创建
        }


        this.m_BannerAd.onSize(size => {
            console.log(size.width, size.height, "------------banner长宽-----------");
            // this.m_BannerAd.style.top = size.height;//screenHeight - size.height;
            // this.m_BannerAd.style.left = size.width;//(screenWidth - size.width) / 2;
            // setBannerPosition && setBannerPosition({ x: this.m_BannerAd.style.left, y: this.m_BannerAd.style.top },
            //     { width: size.width, height: size.height });
        });

        this.m_BannerAd.onLoad(() => {
            if (node == null || !node.active || !node.isValid) {
                console.log("---------------------------------------------------------");
                return
            }
            this.bannerSuccese = false;
            this.m_BannerAd
                .show()
                .then(() => {
                    successCB && successCB();
                    console.log("---------------------Banner广告显示成功");

                    this.m_BannerAd.onClose(() => {
                        onCloseCB && onCloseCB();
                    });
                })
                .catch((err) => {
                    errorCB && errorCB(err);
                    console.log("---------------------Banner广告组件显示出现问题" + err.errCode + " :" + err.errMsg);
                });
        });

        this.m_BannerAd.onError((err) => {
            this.bannerSuccese = false;
            errorCB && errorCB(err);
            console.log("---------------------Banner广告加载错误,错误原因：" + err.errCode + " :" + err.errMsg);
        });
    }

    hideBanner() {
        // if (this.m_BannerAd != null) {
        //     this.m_BannerAd.hide();
        // }
    }


    recordedGameScreenStart(params: recordedGameScreenParams, onStart?: (res: any) => void): void {
        console.log("vivo-api-recordedGameScreenStart");
        onStart && onStart(null);
    }
    recordedGameScreenStop() {
        console.log("vivo-api-recordedGameScreenStop");
        return true;
    }
    shareRecordedGameScreen(successCb?: () => void, failCb?: (e?: any) => void): void {
        console.log("vivo-api-shareRecordedGameScreen");
        successCb && successCb();
    }
    isHaveRecordedGameScreen(): boolean {
        return true;
    }

}